package DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import modelo.AcessoBD;
import modelo.Funcionario;

public class FuncionarioImplementsDAO implements FuncionarioDAO{
	
	public void cadastrarFuncionario(	int codCargo,
										String nmNomeFuncionario,
										int nmCPF,
										int nmCTPS,
										String nmDataNascimento,
										String nmEndereco,
										String nmNumero,
										String nmSenha		){
		
		AcessoBD bd = new AcessoBD();
		Connection con = null;
		PreparedStatement stmt = null;
		
		try {
			String sql = "insert into funcionario (codCargo, nmNomeFuncionario, nmCPF, nmCTPS, nmDataNascimento, nmEndereco, nmNumero, nmSenha) " +
							"values (?,?,?,?,?,?,?,?)";
			
			con = bd.obtemConexao();
			stmt = con.prepareStatement(sql);
			
			stmt.setInt(1, codCargo);
			stmt.setString(2, nmNomeFuncionario);
			stmt.setInt(3, nmCPF);
			stmt.setInt(4, nmCTPS);
			stmt.setString(5, nmDataNascimento);
			stmt.setString(6, nmEndereco);
			stmt.setString(7, nmNumero);
			stmt.setString(8, nmSenha);
			
			stmt.execute();
			
		} catch (SQLException sq) {
			sq.printStackTrace();

		} finally {
			// IMPORTANTE UTILIZACAO DO FINALLY PARA GARANTIR O FECHAMENTO
			// DA CONEXAO COM O BANCO DE DADOS.
			bd.CloseAll(stmt, con);
		} //fim try
	}
	
	
	public List<Funcionario> consultarFuncionario(){
		
		AcessoBD bd = new AcessoBD();
		Connection con = null;
		PreparedStatement stmt = null;		
		ResultSet rs = null;
		
		List<Funcionario> resultado = new ArrayList<Funcionario>();
		
		try{
			String sql = "SELECT * FROM funcionario f " +
						"inner join funcionariocargo fc on fc.codCargo = f.codCargo " +
						"order by nmNomeFuncionario";
			
			con = bd.obtemConexao();
			stmt = con.prepareStatement(sql);
			
			rs = stmt.executeQuery();
			
			while(rs.next()) {
				Funcionario funcionario = new Funcionario();
					funcionario.setCodFuncionario(rs.getInt("codFuncionario"));
					funcionario.setCodCargo(rs.getInt("codCargo"));
					funcionario.setNmNomeFuncionario(rs.getString("nmNomeFuncionario"));
					funcionario.setNmCPF(rs.getInt("nmCPF"));
					funcionario.setNmCTPS(rs.getInt("nmCTPS"));
					funcionario.setNmDataNascimento(rs.getString("nmDataNascimento"));
					funcionario.setNmEndereco(rs.getString("nmEndereco"));
					funcionario.setNmNumero(rs.getString("nmNumero"));
					funcionario.setNmSenha(rs.getString("nmSenha"));
					funcionario.setCodCargo(rs.getInt("codCargo"));
					funcionario.setNmCargo(rs.getString("nmCargo"));
					
					resultado.add(funcionario);
			}
			return resultado;
			
		}catch (SQLException sq) {
			sq.printStackTrace();
			return new ArrayList<Funcionario>();

		} finally {
			// IMPORTANTE UTILIZACAO DO FINALLY PARA GARANTIR O FECHAMENTO
			// DA CONEXAO COM O BANCO DE DADOS.
			bd.CloseAll(stmt, con, rs);
		}		
	}
	
	public void editarFuncionario( int codCargo, String nmEndereco, String nmNumero, String nmSenha, int codFuncionario){
		
		AcessoBD bd = new AcessoBD();
		Connection con = null;
		PreparedStatement stmt = null;
		
		try {
			String sql = "update funcionario set codCargo = ?, nmEndereco = ?, nmNumero = ?, nmSenha = ? where codFuncionario = ?";
			
			con = bd.obtemConexao();
			stmt = con.prepareStatement(sql);
			
			stmt.setInt(1, codCargo);
			stmt.setString(2, nmEndereco);
			stmt.setString(3, nmNumero);
			stmt.setString(4, nmSenha);
			stmt.setInt(5, codFuncionario);
			
			stmt.execute();
			
		} catch (SQLException sq) {
			sq.printStackTrace();

		} finally {
			// IMPORTANTE UTILIZACAO DO FINALLY PARA GARANTIR O FECHAMENTO
			// DA CONEXAO COM O BANCO DE DADOS.
			bd.CloseAll(stmt, con);
		} //fim try
	}
	
	public void excluirFuncionario( int codFuncionario ){
		
		AcessoBD bd = new AcessoBD();
		Connection con = null;
		PreparedStatement stmt = null;
		
		try {
			String sql = "delete from funcionario where codFuncionario = ?";
			
			con = bd.obtemConexao();
			stmt = con.prepareStatement(sql);
			
			stmt.setInt(1, codFuncionario);
			
			stmt.execute();
			
		} catch (SQLException sq) {
			sq.printStackTrace();

		} finally {
			// IMPORTANTE UTILIZACAO DO FINALLY PARA GARANTIR O FECHAMENTO
			// DA CONEXAO COM O BANCO DE DADOS.
			bd.CloseAll(stmt, con);
		} //fim try
	}
	
	

}
